import cv2
import numpy as np


# 定义一个函数用于显示图像
def show_img(name, img):
    cv2.imshow(name, img)  # 使用OpenCV的imshow函数显示图像
    cv2.waitKey(0)  # 等待任意键被按下
    cv2.destroyAllWindows()  # 关闭所有OpenCV创建的窗口


# 读取图像文件，并将其转换为灰度图像
img = cv2.imread('sun.jpg', cv2.IMREAD_GRAYSCALE)

# 应用二值化阈值处理
ret, ref = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)

# 梯度 = 膨胀 - 腐蚀
# 创建一个3x3的结构元素
kernel = np.ones((3, 3), np.uint8)

# 使用结构元素对图像进行膨胀操作
dilate = cv2.dilate(ref, kernel, iterations=5)

# 使用结构元素对图像进行腐蚀操作
erode = cv2.erode(ref, kernel, iterations=5)

# 将膨胀和腐蚀后的图像水平堆叠在一起
res = np.hstack((dilate, erode))

# 显示堆叠后的图像
show_img('res', res)

# 使用结构元素计算图像的梯度
gradient = cv2.morphologyEx(ref, cv2.MORPH_GRADIENT, kernel)

# 显示计算得到的梯度图像
show_img('gradient', gradient)
